﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace robot
{
    class Salle
    {
        //List de objets de la salle
        private List<Objet> objets;
        //Liste des salles voisines
        private Dictionary<String, Salle> voisins;
        //Nom de la salle
        private string nom;
        //Lise de nom de boisson
        private List<string> boissons;
        //Lise de nom de salle
        private List<string> nomSalle;
        //Lise de nom de couleur
        private List<string> couleur;
        //Variable aléatoire
        static Random rand = new Random();

        public List<Objet> Objets
        {
            get
            {
                return objets;
            }
        }
        public Salle()
        {
            objets = new List<Objet>();
            voisins = new Dictionary <String, Salle>();
            nom = "nul nom";
        }
        
        public Salle(int nbObjets)
        {
            //Initialise les listes de boissons, de nom de salle et de couleur
            InitListes(); 
            objets = new List<Objet>();
            voisins = new Dictionary <String, Salle>();

            //Initialisation du nom
            nom = nomSalle[rand.Next(nomSalle.Count() - 1)];
           
            int obj = 0;
            for (int i = 0; i < nbObjets; i++)
            {
                obj = rand.Next(3);
                //Ajout aléatoire d'objets
                switch (obj)
                {
                    case 0 :
                        objets.Add(new Bouteille(rand.Next(3) + 1, boissons[rand.Next(boissons.Count()-1)]));
                        break;
                    case 1:
                        objets.Add(new Table(rand.Next(30) + 10, rand.Next(30) + 10));
                        break;
                    case 2:
                        objets.Add(new Chaise(rand.Next(2) + 4, couleur[rand.Next(couleur.Count() - 1)]));
                        break;
                }
                
            }
            
        }

        /**
         * Ajoute une salle voisine
         */
        public void AjoutVoisin(Salle s, String nom)
        {
            if (voisins.ContainsKey(nom))
            {
                voisins.Remove(nom);
            }
            voisins.Add(nom, s);
        }

        /**
         * Ajoute un objet dans la salle
         */
        public void AjouterObjet(Objet o)
        {
            objets.Add(o);
        }

        /**
         * Retire un objet de la salle
         */
       public Objet Retirer(int index)
        {
            if (index < 0 || index > objets.Count())
                return null;
            Objet o = objets[index];
            objets.RemoveAt(index);
            return o;
        }

        /**
         * Retire tous les objets de la salle
         */
        public void Clear()
        {
            objets.Clear();
        }
      
        /**
         * Affiche le descriptif de la salle
         */
        public String Description()
        {
            String s = "La salle se prénomme "+nom+"\n";
            int count = objets.Count();

            if (count < 1)
                s += "Elle ne contient pas d'objet";
            else if (count == 1)
                s += "Elle contient l'objet 0 :" + objets[0].ToString();
            else
                s += "Elle contient les objets \n" + ListerContenu();

            return s+SallesVoisines();
        }

        /**
         * Retourne le nom des salles voisines
         */
        public String SallesVoisines()
        {
            String s = "";
            foreach (String nom in voisins.Keys)
            {
                s += "\t "+nom+" : " + voisins[nom].nom;
            }


            if (s == "")
                return "Vous vous êtes fait piégé... l'entrée s'est refermée, vous ne pouvez plus sortir de la salle";

            return s;
        }

        /**
         * Affiche le contenu de la salle
         */
        public String ListerContenu()
        {
            String s = "";
            int i = 0;
            foreach (Objet o in objets)
            {
                s += i+ ") "+o.ToString()+"\n";
                i++;
            }
            return s;
        }

        override public String ToString()
        {
            return Description();
        }

        /**
         * Renvoie la salle voisine se trouvant dans le direction indiquer par s et null s'il y a un mur
         */
        public Salle Voisine(String s){
            if(voisins.ContainsKey(s))
                return voisins[s];
            return null;
        }

        /**
         * Initialise les tableaux de données
         */
        private void InitListes()
        {
            boissons = new List<string>();
            boissons.Add("vodka");
            boissons.Add("whisky");
            boissons.Add("ruhm");
            boissons.Add("vin");
            boissons.Add("punch");
            boissons.Add("jus_de_fruit");
            boissons.Add("baileys");

            nomSalle = new List<string>();
            nomSalle.Add("cuisine");
            nomSalle.Add("hall");
            nomSalle.Add("salon");
            nomSalle.Add("grand salon");
            nomSalle.Add("salle a manger");
            nomSalle.Add("grand hall");
            nomSalle.Add("salle de bain");

            couleur = new List<string>();
            couleur.Add("jaune");
            couleur.Add("vert");
            couleur.Add("rouge");
            couleur.Add("bleu");
            couleur.Add("orange");
            couleur.Add("violet");
        }
    }
}
